﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Model;
using Interface;

namespace Controller
{
    // Denne klassecontroller er lavet af Gruppe 4 DM12a
    public class BookingController
    {
        // session variabler
        Kunde aktuelKunde;
        Booking aktuelBooking;
        Forbrug aktuelForbrug;
        Værelse aktuelVærelse;
        Tilbehør aktuelTilbehør;
       
        // klasseattributter
        BookingCollection bookingCol;
        ForbrugCollection forbrugCol;
        KundeCollection kundeCol;
        VærelseCollection værelseCol;
        TilbehørCollection tilbehørCol;

        DBFacade dbFacade; // skal referere til databasefacade objekt 

        public BookingController() // konstruktøren
        {
            bookingCol = new BookingCollection(); // instantiere Bookingcollection
            forbrugCol = new ForbrugCollection();
            kundeCol = new KundeCollection();
            værelseCol = new VærelseCollection();
            tilbehørCol = new TilbehørCollection();
            dbFacade = new DBFacade(this); // her sendes BookingController med

            IndlæsAlt(); // bruger metoden IndlæsAlti
        }

        public void IndlæsAlt()
        {
            dbFacade.IndlæsKunder(); // bruger metoden i dbFacade.
            dbFacade.IndlæsVærelser();
            dbFacade.IndlæsBooking();
            dbFacade.IndlæsForbrug();
            dbFacade.IndlæsTilbehør();
            dbFacade.IndlæsBookedeVærelser();
            dbFacade.IndlæsKøbtTilbehør();
        }

        #region KUNDE

        // metoden er lavet af Visi
        // metoden OpretKunde har parametrene indenfor parantesen
        public void OpretKunde(string navn, string adresse, string postNr, string distrikt, int tlfNr, string email, int kundeId, string land)
        {
            // aktuelKunde sættes lig med den nye kunde man opretter i KundeCol ved brug af metoden RegistrerKunde, med dens parametre
            aktuelKunde = kundeCol.RegistrerKunde(navn, adresse, postNr, distrikt, tlfNr, email, kundeId, land);
        }

        // metoden er lavet af Ismail
        public List<IKunde> KundeList() // en metode der returnere en Liste med Ikunde
        {
            List<Kunde> kundeList = kundeCol.KundeListe; // her er listen med Kunde som ligger i KundeCol
            List<IKunde> IkundeList = new List<IKunde>(); // en ny generisk liste med IKunde

            foreach (Kunde kunde in kundeList) // hvor hver enkelt kunde i kundeList gør den følgende
            {
                IkundeList.Add((IKunde)kunde); // parser kunde med Ikunde, og ligger (Ikunde)kunde i listen iKundeList
            }
            return IkundeList; //  returnere IkundeList
        }

        // metoden er lavet af Søren
        public void FindKunde(int kundeId) // metoden FindKunde med 1 parameter kundeId
        {
            aktuelKunde = kundeCol.FindKunde(kundeId); // aktuelKunde sættes lig med kunden der bliver returneret fra metoden FindKunde, der ligger i kundeCol
        }

        // metoden er lavet af Nirujan
        public void SletKunde(int kundeId)
        {
            dbFacade.SletKunde(kundeId);
            FindKunde(kundeId); // bruger metoden FindKunde med parameter kundeId
            for (int i = 0; i < kundeCol.KundeListe.Count; i = i + 1) // for løkke hvor betingelsen er at i skal være mindre en antallet i KundeCol.KundeList
            {
                if (kundeCol.KundeListe[i].KundeId == aktuelKunde.KundeId) // sammenligner
                {
                    kundeCol.KundeListe.RemoveAt(i); // fjerner kunden der har plads i i KundeList
                }
            }
            //dbFacade.SletKunde(kunde);
        }

        // metoden er lavet af Ismail
        public string VælgKunde(int kundeId) // returnere en streng
        {
            FindKunde(kundeId);
            return "Du har valgt følgende kunde: " + aktuelKunde.Navn + " med kunde Id: " + aktuelKunde.KundeId;
        }

        // metoden er lavet af Ismail
        public int GemKunde(string navn, string adresse, string postNr, int tlf, string email, string land)
        {
           return dbFacade.OpretKunde(navn, adresse, postNr, tlf, email, land); // returnere det der bliver returneret i metoden OpretKunde i dbFacade
        }

        // metoden er lavet af Søren
        public void Redigere(int kundId, string navn, string adresse, int tlf, string email, string land)
        {
            dbFacade.RedigerKunde(kundId, navn, adresse, tlf, email, land);
            kundeCol.Rediger(navn, adresse, tlf, email, kundId, land);
        }

        // metoden er lavet af Ismail
        public void TilknytKundeTilBooking(int kundeId)
        {
            FindKunde(kundeId);
            aktuelKunde.TilknytBooking(aktuelBooking); // bruger metoden TilknytBooking i Kunde klassen
        }

        // metoden er lavet af Ismail
        public IKunde HentAktuelKunde()
        {
            return (IKunde)aktuelKunde; // aktuelKunde parses med Ikunde, og den aktuelle kunde returneres.
        }

        #endregion

        #region Booking

        // metoden er lavet af Søren
        public void OpretBooking(DateTime ankomst, DateTime afrejse, int antalVærelser, int antalPersoner, int bookingId)
        {
            aktuelBooking = bookingCol.RegistrerBooking(ankomst, afrejse, antalVærelser, antalPersoner, bookingId);
        }

        // metoden er lavet af Nirujan
        public List<IBooking> BookingList()
        {
            List<Booking> bookingList = bookingCol.BookingListe;
            List<IBooking> IbookingList = new List<IBooking>();

            foreach (Booking booking in bookingList)
            {
                IbookingList.Add((IBooking)booking);
            }
            return IbookingList;
        }

        // metoden er lavet af Søren
        public void FindBooking(int bookingId)
        {
           aktuelBooking = bookingCol.FindBooking(bookingId);
        }

        // metoden er lavet af Ismail
        public int GemBooking1(DateTime ankomst, DateTime afrejse, int antalVærelser, int antalPersoner, int kundeId, int værelseId, decimal pris)
        {
            kundeId = aktuelKunde.KundeId;
            return dbFacade.OpretBooking(ankomst, afrejse, antalVærelser, antalPersoner, kundeId, værelseId, pris);
        }

        // metoden er lavet af Søren og Ismail
        public void TilknytBookingTilVærelse(int bookingId, int værelseId)
        {
            FindVærelse(værelseId);
            FindBooking(bookingId);
            aktuelVærelse.TilknytBooking(aktuelBooking); // bruger metoden Tilknytbooking i Værelse klassen, hvor den sender aktuelBooking med
            aktuelBooking.TilknytVærelse(aktuelVærelse); // bruger metoden TilknytVærelse i Booking klassen, hvor den sender akteulVærelse med
        }

        // metoden er lavet af Ismail
        public List<IVærelse> Bookinger(int bookingId)
        {
            FindBooking(bookingId);
            return aktuelBooking.MineVærelser; // returner listen MineVærelser
        }

        #endregion

        #region Værelse

        // metoden er lavet af Visi
        public void OpretVærelse(int værelseId, string type, decimal pris, int størrelse, bool morgenmad, string billed)
        {
            aktuelVærelse = værelseCol.OpretVærelse(værelseId, type, pris, størrelse, morgenmad, billed);
        }

        // metoden er lavet af Visi
        public List<IVærelse> VærelseList()
        {
            List<Værelse> Værelselist = værelseCol.mineVærelser;
            List<IVærelse> IVærelselist = new List<IVærelse>();

            foreach (Værelse værelse in Værelselist)
            {
                IVærelselist.Add((IVærelse)værelse);
            }
            return IVærelselist;
        }

        // metoden er lavet af Ismail
        public void FindVærelse(int værelseId)
        {
            aktuelVærelse = værelseCol.FindVærelse(værelseId);
        }

        // metoden er lavet af Søren og Ismail
        public void TilknytForbrugTilVærelse(int forbrugId, int værelseId, int bookingId)
        {
            aktuelVærelse = værelseCol.FindVærelse(værelseId);
            aktuelForbrug = forbrugCol.FindForbrug(forbrugId);
            aktuelBooking = bookingCol.FindBooking(bookingId);
            aktuelBooking.TilknytForbrug(aktuelForbrug); // bruger metoden TilknytForbrug og sender aktuelForbrug med
        }

        #endregion

        #region Forbrug/Tilbehør

        // metoden er lavet af Nirujan
        public void OpretForbrug(decimal pris, int forbrugId)
        {
            aktuelForbrug = forbrugCol.RegistrerForbrug(pris, forbrugId);
        }

        // metoden er lavet af Ismail
        public int OpretForbrugIDb(decimal pris, int bookingId)
        {
            return dbFacade.OpretForbrug(pris, bookingId);
        }

        // metoden er lavet af Søren
        public void FindForbrug(int forbrugId)
        {
            aktuelForbrug = forbrugCol.FindForbrug(forbrugId);
        }

        // metoden er lavet af Søren
        public void FindTilbehør(int tilbehørId)
        {
            aktuelTilbehør = tilbehørCol.FindTilbehør(tilbehørId);
        }

        // metoden er lavet af Ismail
        public List<IForbrug> ForbrugList()
        {
            List<Forbrug> mineForbrug = forbrugCol.MineForbrug;
            List<IForbrug> forbrugList = new List<IForbrug>();

            foreach (IForbrug iForbrug in mineForbrug)
            {
                forbrugList.Add((IForbrug)iForbrug);
            }
            return forbrugList;
        }

        // metoden er lavet af Ismail
        public List<ITilbehør> TilbehørList()
        {
            List<Tilbehør> tilbehørList = tilbehørCol.MineTilbehør;
            List<ITilbehør> ItilbehørList = new List<ITilbehør>();

            foreach (Tilbehør tilbehør in tilbehørList)
            {
                ItilbehørList.Add((ITilbehør)tilbehør);
            }
            return ItilbehørList;
        }

        // metoden er lavet af Visi
        public void GemTilbehør(int tilbehørId, string betegnelse, decimal pris)
        {
            tilbehørCol.RegistrerTilbehør(tilbehørId, betegnelse, pris);
        }

        // metoden er lavet af Søren og Ismail
        public void TilknytTilbehørTilForbrug(int tilbehørId, int forbrugId)
        {
            aktuelForbrug = forbrugCol.FindForbrug(forbrugId);
            aktuelTilbehør = tilbehørCol.FindTilbehør(tilbehørId);
            aktuelForbrug.TilknytTilbehør(aktuelTilbehør);
        }

        #endregion

        // metoden er lavet af Søren
        public string HentByer(string postNummer)
        {
            // returnere en streng fra metoden HentByer med postNummer som parameter
            return dbFacade.HentByer(postNummer);
        }

        // metoden er lavet af Søren og Ismail
        public decimal SamletPris(DateTime ankomst, DateTime afrejse, int værelseId)
        {
            FindVærelse(værelseId); // finder værelse med værelseId
            decimal samletPris = 0;
            TimeSpan rejsen = afrejse - ankomst; // berenger rejsen ved at trække afrejse fra ankomst
            samletPris = (rejsen.Days* aktuelVærelse.Pris); // metoden for hvordan samletPris beregnes
            return samletPris; // returnere samletPris som er en decimal
        }

        // metoden er lavet af Søren
        public decimal Tillægmorgenmad(int morgenmadsTillæg)
        {
            aktuelVærelse.Pris = aktuelVærelse.Pris + morgenmadsTillæg; // morgenmadsTillæg lægges til aktuelle værelses pris
            return aktuelVærelse.Pris; // prisen returneres
        }

        // metoden er lavet af Ismail og Søren
        public decimal EkstraTilbehør(decimal tilbehør)
        {
            aktuelForbrug.Pris = aktuelForbrug.Pris + tilbehør; // prisen tilbehør bliver lagt til det aktuelle forbrugs pris
            dbFacade.GemTilbehør(aktuelTilbehør.tilbehørId, aktuelForbrug.forbrugId, aktuelForbrug.Pris); // bruger metoden GemTilbehør i dbFacade
            return aktuelForbrug.Pris; // returnere aktuelt forbrugs pris.
        }
    }
}
